// enum List {
//     Cons(i32, Box<List>),
//     Nil,
// }

enum List {
    Cons(i32, Rc<List>),
    Nil,
}

use std::rc::Rc;
use crate::List::{Cons, Nil};
fn main() {
    // let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
    // let b = Cons(3, Box::new(a));
    // let c = Cons(4, Box::new(a)); // a会报错，原因是a已经将所有权给b了

    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    // let b = Cons(3, Rc::clone(&a)); // 直接克隆，不用获取所有权
    // 也可以这样写
    let _b = Cons(3, a.clone());
    let _c = Cons(4, Rc::clone(&a)); // 直接克隆，不用获取所有权

    println!("Hello, world!");
}
